import java.util.*;

/**
 * Created with IntelliJ IDEA.
 * Description:重复元素1、重复元素2、只出现一次的数字
 * Date: 2024-02-12
 * Time:16:09
 */
public class Solution {
    public boolean containsDuplicate(int[] nums) {
        Set<Integer> set = new HashSet<>();
        //遍历数组，若set中没有，则加入set，若有，return true
        for (int num : nums) {
            if (set.contains(num)) {
                return true;
            } else {
                set.add(num);
            }
        }
        return false;
    }
////////////////////////////////////////////////////////////

    public boolean containsNearbyDuplicate(int[] nums, int k) {
        //做某种标记/标记上一次出现的位置
        //图：数字、上次出现的位置
/*
        Map<Integer,Integer> map = new TreeMap<>();
        for(int num:nums) {
            if(map.containsKey(num)) {
                //得到map中的那个num的value

            } else {
                map.put(num,map.size());
            }
        }
*/
        Set<Integer> set = new TreeSet<>();
        for (int i = 0; i < nums.length; i++) {
            if (set.contains(nums[i])) {
                return true;
            } else {  //判断set的元素个数是否大于k  若大于则移除最前面的  若小于，则add
                if (set.size() == k) {
                    set.remove(nums[i - k]);
                }
                set.add(nums[i]);
            }
        }
        return false;
    }

    ////////////////////////////////////////////////////////
    //只出现一次的数字1
    public int singleNumber(int[] nums) {
        Set<Integer> set = new HashSet<>();
        for (int num : nums) {
            if (set.contains(num)) {
                set.remove(num);
            } else {
                set.add(num);
            }
        }
        for (int num : nums) {
            if (set.contains(num))
                return num;
        }
        return -1;
    }

    //////////////////////////////////////////////
    //只出现一次的数字2
    public int singleNumber2(int[] nums) {
        Map<Integer, Integer> map = new HashMap<>();
        for (int num : nums) {
            map.put(num, map.getOrDefault(num, 0) + 1);
        }

        for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
            if (entry.getValue() == 1) {
                return entry.getKey();
            }
        }
        return -1;
    }

    /////////////////////////////////////////////
    //只出现一次的数字3
    public int[] singleNumber3(int[] nums) {
/*
        int count = 0;
        int[] ret = new int[2];
        Set<Integer> set = new HashSet<>();
        for(int num:nums) {
            if(set.contains(num)) {
                set.remove(num);
            } else {
                set.add(num);
            }
        }
        for(int num:nums) {
            if(set.contains(num)) {
                ret[count++] = num;
            }

        }
        return ret;
*/
        Map<Integer, Integer> map = new HashMap<>();
        for (int num : nums) {
            map.put(num, map.getOrDefault(num, 0) + 1);
        }
        int[] ret = new int[2];
        int count = 0;
        for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
            if (entry.getValue() == 1) {
                ret[count++] = entry.getKey();
            }
        }
        return ret;
    }

    ///////////////////////////////////////////////////////////
    //故障键盘
    public String finalString(String s) {
        StringBuilder sb = new StringBuilder();
        for (char ch : s.toCharArray()) {
            if (ch != 'i') {
                sb.append(ch);
            } else {
                sb.reverse();
            }
        }
        return sb.toString();
    }
}
